昨日介紹了 strip,原訂今日緊接著實作的部份,但是因為時間分配的考量,筆者先繼續介紹其他的工具程式。今日的主角是:nm。
從之前實作組譯器 as 到昨日介紹的 strip,都反覆的提及連結需要標籤,那麼有沒有什麼方法可以直接看看這些標籤呢?nm 就是為了這個需求而生!
以昨日的 a.out
與 b.out
(被 strip 過的 a.out
) 為例,分別使用 GNU 的 nm,可以得到
$ riscv64-unknown-linux-gnu-nm a.out
0000000000011e30 d _DYNAMIC
0000000000012020 d _GLOBAL_OFFSET_TABLE_
0000000000012028 G _IO_stdin_used
0000000000010330 t _PROCEDURE_LINKAGE_TABLE_
00000000000104f0 r __FRAME_END__
00000000000104b4 r __GNU_EH_FRAME_HDR
0000000000012000 D __TMC_END__
0000000000012038 B __bss_start
0000000000012000 D __data_start
00000000000103f8 t __do_global_dtors_aux
0000000000011e28 t __do_global_dtors_aux_fini_array_entry
0000000000012030 G __dso_handle
0000000000011e20 t __frame_dummy_init_array_entry
0000000000012828 G __global_pointer$
0000000000011e28 t __init_array_end
0000000000011e20 t __init_array_start
00000000000104aa T __libc_csu_fini
0000000000010452 T __libc_csu_init
U __libc_start_main@@GLIBC_2.26
0000000000012038 G _edata
0000000000012040 B _end
0000000000010370 T _start
000000000001041c T add
0000000000012038 b completed.3093
0000000000012000 W data_start
00000000000103a6 t deregister_tm_clones
0000000000010418 t frame_dummy
0000000000010428 T main
U printf@@GLIBC_2.26
00000000000103ca t register_tm_clones
$ riscv64-unknown-linux-gnu-nm b.out
riscv64-unknown-linux-gnu-nm: b.out: no symbols
那些資訊就是標籤表中的資料格式化之後的結果。因為這是可執行檔的緣故,第一欄的十六進位數字就是這些標籤所在的位址;第二欄的字母則有該標籤所在區段的意思,比方說 t
或是 T
,就代表位在 .text
區段中,也就是程式的意思、B 則代表是為初始化資料區段(.bss
)等。第三個就是標籤本身
也就是說,strip 的效果正如我們宣稱的那樣,消除了 .symtab
區段,使之無法使用對照表。
最近實在是有點吃緊,先以介紹的方式帶過,等到稍有喘息空檔,再將實作成果公開解析出來。請各位讀者多多海涵!